(function (global) {
    var b = /^(b|B)$/,
        symbol = {
            iec: {
                bits: ["b", "Kib", "Mib", "Gib", "Tib", "Pib", "Eib", "Zib", "Yib"],
                bytes: ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"]
            },
            jedec: {
                bits: ["b", "Kb", "Mb", "Gb", "Tb", "Pb", "Eb", "Zb", "Yb"],
                bytes: ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]
            }
        },
        fullform = {
            iec: ["", "kibi", "mebi", "gibi", "tebi", "pebi", "exbi", "zebi", "yobi"],
            jedec: ["", "kilo", "mega", "giga", "tera", "peta", "exa", "zetta", "yotta"]
        };

    /**
     * filesize
     *
     * @method filesize
     * @param  {Mixed}   arg        String, Int or Float to transform
     * @param  {Object}  descriptor [Optional] Flags
     * @return {String}             Readable file size String
     */
    function filesize(arg) {
        var descriptor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

        var result = [],
            val = 0,
            e = void 0,
            base = void 0,
            bits = void 0,
            ceil = void 0,
            full = void 0,
            fullforms = void 0,
            neg = void 0,
            num = void 0,
            output = void 0,
            round = void 0,
            unix = void 0,
            spacer = void 0,
            standard = void 0,
            symbols = void 0;

        if (isNaN(arg)) {
            throw new Error("Invalid arguments");
        }

        bits = descriptor.bits === true;
        unix = descriptor.unix === true;
        base = descriptor.base || 2;
        round = descriptor.round !== undefined ? descriptor.round : unix ? 1 : 2;
        spacer = descriptor.spacer !== undefined ? descriptor.spacer : unix ? "" : " ";
        symbols = descriptor.symbols || descriptor.suffixes || {};
        standard = base === 2 ? descriptor.standard || "jedec" : "jedec";
        output = descriptor.output || "string";
        full = descriptor.fullform === true;
        fullforms = descriptor.fullforms instanceof Array ? descriptor.fullforms : [];
        e = descriptor.exponent !== undefined ? descriptor.exponent : -1;
        num = Number(arg);
        neg = num < 0;
        ceil = base > 2 ? 1000 : 1024;

        // Flipping a negative number to determine the size
        if (neg) {
            num = -num;
        }

        // Determining the exponent
        if (e === -1 || isNaN(e)) {
            e = Math.floor(Math.log(num) / Math.log(ceil));

            if (e < 0) {
                e = 0;
            }
        }

        // Exceeding supported length, time to reduce & multiply
        if (e > 8) {
            e = 8;
        }

        // Zero is now a special case because bytes divide by 1
        if (num === 0) {
            result[0] = 0;
            result[1] = unix ? "" : symbol[standard][bits ? "bits" : "bytes"][e];
        } else {
            val = num / (base === 2 ? Math.pow(2, e * 10) : Math.pow(1000, e));

            if (bits) {
                val = val * 8;

                if (val >= ceil && e < 8) {
                    val = val / ceil;
                    e++;
                }
            }

            result[0] = Number(val.toFixed(e > 0 ? round : 0));
            result[1] = base === 10 && e === 1 ? bits ? "kb" : "kB" : symbol[standard][bits ? "bits" : "bytes"][e];

            if (unix) {
                result[1] = standard === "jedec" ? result[1].charAt(0) : e > 0 ? result[1].replace(/B$/, "") : result[1];

                if (b.test(result[1])) {
                    result[0] = Math.floor(result[0]);
                    result[1] = "";
                }
            }
        }

        // Decorating a 'diff'
        if (neg) {
            result[0] = -result[0];
        }

        // Applying custom symbol
        result[1] = symbols[result[1]] || result[1];

        // Returning Array, Object, or String (default)
        if (output === "array") {
            return result;
        }

        if (output === "exponent") {
            return e;
        }

        if (output === "object") {
            return { value: result[0], suffix: result[1], symbol: result[1] };
        }

        if (full) {
            result[1] = fullforms[e] ? fullforms[e] : fullform[standard][e] + (bits ? "bit" : "byte") + (result[0] === 1 ? "" : "s");
        }

        return result.join(spacer);
    }

    // Partial application for functional programming
    filesize.partial = function (opt) {
        return function (arg) {
            return filesize(arg, opt);
        };
    };

    // CommonJS, AMD, script tag
    if (typeof exports !== "undefined") {
        module.exports = filesize;
    } else if (typeof define === "function" && define.amd) {
        define(function () {
            return filesize;
        });
    } else {
        global.filesize = filesize;
    }
})(typeof window !== "undefined" ? window : global);




function handleErrTips(e) {
    $('#btn_ck').button('reset') 
    var msg = '';

    if (e.responseText !== '' && JSON.parse(e.responseText)) {
        var err = JSON.parse(e.responseText);
        if (err.msg) {
            msg = err.msg
        }
    }
    if (msg === '') {
        msg = e.statusText + ': ' + e.status
    }
    showErrorTips(msg)
}

////
function showOkTips(msg) {

}

function showErrorTips(msg) {
    $.growl({
        title: '提示：',
        message: msg
    }, {
        type: "danger"
    });
}


new Vue({
    el: '#myTabContent',

    data: {
        dataCKResp: '',
        ckData:{
            name:'',
            version:''
        },
        options:null
    },
    mounted:function(){
        var _self = this;
        $.getJSON("/getCkVer",function(data){
            _self.options = data
        })
    },
    filters: {
        fmtFileSize: function (t) {
            if(t){
                return filesize(t)
            }
            return t
        }
    },
    methods: {
        charlesCrack:function(event){
            event.preventDefault();
            var _self = this;

            if(this.ckData.name === ''){
                showErrorTips('请输入名称')
                return
            }

            if(this.ckData.version === ''){
                showErrorTips('请选择版本')
                return
            }

            $('#btn_ck').button('loading') 
            
            $.ajax({
                type: 'POST',
                data: this.ckData,
                url: '/ck',
                dataType: 'json',
                success: function(data) {
                    $('#btn_ck').button('reset') 
                    if (data.file) {
                        _self.dataCKResp = data;
                        $('#update').modal('show')
                    } else {
                        showErrorTips('失败')
                    }

                }
            }).fail(handleErrTips);
        }
    }
});